﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Repositorios;
using Onshi.POS.Articulos.Vistas;
using Onshi.POS.Modelo.Enumeradores;
using System.Data;

namespace Onshi.POS.Articulos
{
    public class ArticulosEstandarDetallePresentador
    {
        #region Constructores

        public ArticulosEstandarDetallePresentador(IArticulosEstandarDetalle vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IArticulosEstandarDetalle vista;

        #endregion

        #region Propiedades

        private RepositorioArticulos RepositorioArticulos
        {
            get { return new RepositorioArticulos(); }
        }

        private RepositorioUbicaciones RepositorioUbicaciones
        {
            get { return new RepositorioUbicaciones(); }
        }

        #endregion

        #region Metodos

        public void Inicializar()
        {
            var articulo = RepositorioArticulos.DevolverPorId(vista.IdArticulo, true);
            if (articulo == null)
                throw new Exception("El artículo no existe");
            vista.IdRubroArticulo = articulo.SubRubro.Rubro.Id;
            vista.RubroArticuloNombre = articulo.RubroNombre;
            vista.IdSubRubroArticulo = articulo.SubRubro.Id;
            vista.SubRubroArticuloNombre = articulo.SubRubroNombre;
            vista.IdMarca = articulo.Marca.Id;
            vista.MarcaNombre = articulo.MarcaNombre;
            vista.IdDescuentoRecargoCantidad = articulo.DescuentoRecargoCantidad.Id;
            vista.DescuentoRecargoCantidadNombre = articulo.DescuentoRecargoCantidadNombre;
            vista.TipoComisionArticuloNombre = articulo.TipoComisionNombre;
            vista.TipoImpuestoArticuloNombre = articulo.TipoImpuestoNombre;
            vista.TipoCostoArticuloNombre = articulo.TipoCostoNombre;
            vista.Codigo = articulo.Codigo;
            vista.Nombre = articulo.Nombre;
            vista.Existencia = articulo.ExistenciaFormato;
            vista.ExistenciaMinima = articulo.ExistenciaMinimaFormato;
            vista.ExistenciaMaxima = articulo.ExistenciaMaximaFormato;
            vista.Costo = articulo.CostoFormato;
            vista.Comision = articulo.ComisionFormato;
            vista.ComisionMaxima = articulo.ComisionMaximaFormato;
            vista.Iva = articulo.IvaFormato;
            vista.Impuesto = articulo.ImpuestoFormato;
            vista.Estado = articulo.Estado;
            vista.Imagen = articulo.Imagen;
            vista.Observaciones = articulo.Observaciones;
            vista.ListadoCamposPersonalizados = articulo.CamposPersonalizados;
            vista.ListadoListasPreciosCompras = articulo.ListasPreciosCompras;
            vista.ListadoListasPreciosVentas = articulo.ListasPreciosVentas;
            vista.ListadoProveedores = articulo.Proveedores;
            vista.TipoArticuloNombre = articulo.TipoNombre;
            vista.IdDescuentoRecargoFechaHora = articulo.DescuentoRecargoFechaHora.Id;
            vista.DescuentoRecargoFechaHoraNombre = articulo.DescuentoRecargoFechaHoraNombre;
            GenerarExistencias(RepositorioUbicaciones.DevolverTodos(), articulo.Variantes.Where(x => !x.EstaEliminado).ToList(), articulo.Existencias);
        }

        private void GenerarExistencias(List<Ubicacion> ubicaciones, List<ArticuloVariante> variantes, List<ArticuloExistencia> existencias)
        {
            var tablaPrincipal = new DataTable();
            tablaPrincipal.Columns.Add("Cantidad", typeof(Int32));
            tablaPrincipal.Columns.Add("IdUbicacion", typeof(Int32));
            tablaPrincipal.Columns.Add("Ubicacion", typeof(String));
            foreach (var item in ubicaciones)
                tablaPrincipal.Rows.Add(0, item.Id, item.Nombre);
            foreach (var item in variantes)
                tablaPrincipal = GenerarTablaExistencias(tablaPrincipal, item);


            for (Int32 fila = 0; fila < tablaPrincipal.Rows.Count; fila++)
            {
                foreach (var existencia in existencias)
                {
                    if ((Int32)tablaPrincipal.Rows[fila]["IdUbicacion"] == existencia.Ubicacion.Id)
                    {
                        var ok = true;
                        foreach (var varianteDetalle in existencia.VariantesDetalles)
                        {
                            for (Int32 columna = 0; columna < tablaPrincipal.Columns.Count; columna++)
                            {
                                if (tablaPrincipal.Columns[columna].ColumnName != "Cantidad" & tablaPrincipal.Columns[columna].ColumnName != "IdUbicacion" & tablaPrincipal.Columns[columna].ColumnName != "Ubicacion")
                                {
                                    if (tablaPrincipal.Columns[columna].ColumnName == varianteDetalle.Variante.Nombre)
                                    {
                                        if ((String)tablaPrincipal.Rows[fila][columna] != varianteDetalle.Valor)
                                        {
                                            ok = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        if (ok)
                        {
                            tablaPrincipal.Rows[fila]["Cantidad"] = existencia.Cantidad;
                        }
                    }
                }
            }

            vista.Existencia = Convert.ToString(existencias.Sum(x => x.Cantidad));
            vista.Existencias = tablaPrincipal.AsEnumerable().OrderBy(x => (String)x["Ubicacion"]).AsDataView().ToTable();
        }

        private DataTable GenerarTablaExistencias(DataTable tablaPadre, ArticuloVariante variante)
        {
            var tabla = new DataTable();
            foreach (DataColumn item in tablaPadre.Columns)
                tabla.Columns.Add(item.ColumnName, item.DataType);
            tabla.Columns.Add(variante.Nombre, typeof(String));

            foreach (var item in variante.Valores)
            {
                var array = new Object[tablaPadre.Columns.Count + 1];
                array[tablaPadre.Columns.Count] = item.Valor;
                if (tablaPadre.Columns.Count == 0)
                    tabla.Rows.Add(array);
                else
                    for (Int32 i = 0; i < tablaPadre.Rows.Count; i++)
                    {
                        for (Int32 y = 0; y < tablaPadre.Columns.Count; y++)
                            array[y] = tablaPadre.Rows[i][y];
                        tabla.Rows.Add(array);
                    }
            }
            return tabla;
        }

        #endregion
    }
}
